import axios, { AxiosRequestConfig } from "axios";
import { ElMessage, ElMessageBox } from "element-plus";
import { store } from '@/store'
import router from "../router";
let isRefreshing = false;

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL
});

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 统一设置用户身份 token
    if(store.user && store.user.token) {
      config.headers['Authorization'] = `Bearer ${store.user.token}`;
    }

    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  const status = response.data.status
  if(!status || status === 200) {
    return response;
  }

  // 错误情况，比如token无效

  if(status === 41000) {
    if(isRefreshing)      return Promise.reject(error);
    isRefreshing = true

    ElMessageBox.confirm('您的登录信息已过去，请重新登录', '提示').then(() => {
    
    // 1. 清除过期的登录状态
    // 2. 跳转到登录页面
    // 3. 抛出异常
      store.commit('setUser', null)
      router.push({
        name: 'login',
        query: {
          redirect: router.currentRoute.value.fullPath
        }
      })
    }).finally(() => {
      isRefreshing = false
    })

    return Promise.reject(response);

  }


    // 统一处理接口响应错误，例如token过期
  if(response.data.status && response.data.status !== 200) {
    ElMessage.error('请求失败，请联系管理员');
    return Promise.reject(response.data);
  }

    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });


export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then(res => {
    return (res.data.data || res.data) as T
  })
}